#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int g_val = 100;

int main()
{
    // 地址一样，但是值不一样的情况，可以说明，我们的所写的C的变量的地址，不是物理地址，它是线性地址或者叫虚拟地址
    pid_t id = fork();
    
    if(id == 0)
    {
        // 子进程
        int cnt = 5;
        while(1)
        {
            printf("i am son : pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
            
            if(cnt) cnt--;
            else 
            {
                g_val = 200;
                printf("son change: 100 -> 200\n");
                cnt = 100;
            } 
        }
    }
    else 
    {
        // 父进程
        while(1)
        {
            printf("i am father : pid: %d, ppid: %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
        }
    }

    return 0;
}



//int g_val_1;
//int g_val_2 = 100;
//
//int main()
//{   
//    // 按照地址空间地址由小到大的顺序打印地址
//    
//    printf("code address: %p\n", main);
//    const char* str = "hello world";
//    printf("read only string address: %p\n", str);
//    printf("init global value address: %p\n", &g_val_2);
//    printf("uninit global value address: %p\n", &g_val_1);
//    char* mem = (char*)malloc(100);
//    printf("heap address: %p\n", mem);
//    printf("堆区地址与地址空间的增大方向一样:\n");
//    char* mem1 = (char*)malloc(100);
//    char* mem2 = (char*)malloc(100);
//    char* mem3 = (char*)malloc(100);
//    printf("heap mem1  address: %p\n", mem1);
//    printf("heap mem2  address: %p\n", mem2);
//    printf("heap mem3  address: %p\n", mem3);
//    
//    
//    
//    printf("stack address: %p\n", &str);
//    printf("栈区地址向地址空间减小的方向增大:\n");
//    int a = 0;
//    int b = 0;
//    int c = 0;
//    printf("stack A address: %p\n", &a);
//    printf("stack B address: %p\n", &b);
//    printf("stack C address: %p\n", &c);
//    
//    
//    return 0;
//}
